feat(kilo-app): add KiloClaw chat with Stream Chat#1674
Conversation
Code Review SummaryStatus: 3 Issues Found | Recommendation: Address before merge Overview
Issue Details (click to expand)WARNING
Other Observations (not in diff)Issues found in unchanged code that cannot receive inline comments:
Fix these issues in Kilo Cloud Files Reviewed (8 files)
Reviewed by gpt-5.4-20260305 · 220,042 tokens |
- Move chat from tab navigator to standalone stack screen so tab bar doesn't cover the message input - Show machine name in the chat header instead of generic "Chat" - Pass bottom safe area inset to Channel for proper home indicator spacing - Add horizontal/vertical padding for screen edge curvature - Set keyboardVerticalOffset=0 (no native nav header) - Fix hot reload crash by not disconnecting singleton StreamChat client in effect cleanup - Enable Sentry in dev mode for crash visibility - Remove LogBox i18next suppression (no longer needed)
Style MessageInput via Stream Chat theme to keep the separator edge-to-edge while padding the input content. Extract chat hooks to a separate file and improve keyboard handling. Add NSPhotoLibraryUsageDescription so tapping the attachment button shows the permission prompt instead of crashing.
Map app design tokens to Stream Chat's theme color keys so chat backgrounds, message bubbles, date headers, and input match the rest of the app in dark mode.
Use "chat/[instance-id]" instead of "chat" in the (app) Stack layout to match the actual route path. Restore stream-chat LogBox.ignoreLogs that were lost in a prior merge.
stream-chat-expo auto-registers Expo-compatible native handlers (audio, file picker, etc.), fixing the "No recorder instance" runtime error. Also removes 7 peer deps that stream-chat-expo bundles internally.
…p config Remove @gorhom/bottom-sheet and react-native-nitro-modules (no longer needed after stream-chat-expo migration). Keep @react-native-community/netinfo as it's still a required peer dep of stream-chat-react-native-core.
…tale expo-doctor config These were unused config plugins. Also re-add stream-chat (JS client) which is directly imported for the StreamChat class and Channel type.
…etection keyboardWillShow/Hide are iOS-only events, so keyboard state never updated on Android, causing wrong bottom inset in the chat layout.
…at input Replace custom KeyboardAvoidingView + useKeyboardAwareBottomInset with Stream Chat's built-in keyboard handling. Pass bottomInset for safe area and measure header height for keyboardVerticalOffset so the input clears the Android navigation bar.
…gure permissions Add expo-audio, expo-document-picker, expo-image-picker, expo-media-library, expo-sharing, and expo-video with their Expo config plugins. Add iOS infoPlist entries for camera, microphone, photo library, and photo library save access.
catrielmuller
left a comment
There was a problem hiding this comment.
Hi @iscekic, could you please add a "Thinking..." message to the bot's responses when the content is initially empty? This would enhance the user experience. Currently, OpenClaw first sends an empty message, and then updates it once it receives a response from the LLM. You can refer to this example for guidance: https://github.com/Kilo-Org/kilocode/pull/7960/changes#diff-5bbb72df3cce4225d35536a23aa77bb95da0a0eabeda91f54077c9628f7db6b8R25.
Thank you!
…undingClientRect stream-chat-react-native-core ships a postinstall that patches @gorhom/bottom-sheet to add typeof guards before calling unstable_getBoundingClientRect. pnpm doesn't reliably re-run this cross-package postinstall on re-links, so use patchedDependencies to apply it at the store level instead.
Video thumbnails in the attachment picker used raw ph:// asset URIs which RCTImageLoader cannot resolve. Use the already-resolved local file URI instead, matching what is done for the main asset URI.
I'm not seeing empty responses from my short testing. Merging, saving your comment to check later. |
Summary
stream-chat-react-nativeSDKgetStreamChatCredentialstRPC procedure — no backend changes neededTest plan